Redis Keys

键(keys)通常背后都会代表着一个数据结构,就已字符串的形式来称,他会表现为 key_name=value_name 在 Redis 中的命令与常见的数据传输码类似,如 SET 是创建、GET 是请求。

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> SET key_name hello,world!
OK
127.0.0.1:6379> GET key_name
"hello,world!"
127.0.0.1:6379> DEL key_name
(integer) 1
127.0.0.1:6379> GET key_name
(nil)
127.0.0.1:6379>

在上面的命令中,我们通过 SET 创建了一个 key_name,他的值是 **hello,world!**,并通过 GET 进行请求,毫无疑问返回的是对应的值。

键的操作

在这个之间还使用到了 DEL 他是删除键的意思,而对于键的操作,并不只有这一条命令:

Id Name Info Command
1 DEL 删除 Key DEL value_name
2 DUMP 序列化 key,返回所序列化的值 DUMP key_name
3 EXISTS 检查 key 是否存在 EXISTS key_name (存在返回1,不存在返回0,虽然你通过 GET 也可以媲美 EXISTS 的效果)
4 RANDOMKEY 随机从数据库中抽取一个 key RANDOMKEY
5 RENAME 修改 key 的名称 RENAME key_name new_name
6 RENAMENX 为了避免错误,虽然与 RENAME 同样是修改名称,但 RENAME 会直接覆盖(无论是否存在),而如果用此命令如果是相同的键名则会返回错误(0)创建成功会返回 1 RENAMENX key key_name
7 TYPE 返回 key 所存储的数据类型 TYPE key_name

易失 key

Id Name Info Command
1 EXPIRE 设置 key 的过期时间 EXPIRE key_name 10(```EXPIRE 的单位是秒,即10秒后过期)
2 PEXPIRE 设置 key 的过期时间(毫秒) PEXPIRE key_name 10
3 PSETEX 设置 key 的过期时间(毫秒) PTTL key_one
4 EXPIREAT 通过 UNIX 时间戳的方式为 key 设置过期时间 EXPIREAT key_name 1626521040 (2021-07-17 19:24 过期)
5 PEXPIREAT 通过 Unix 时间戳的形式来设置 key 过期时间,与 EXPIREAT 的区别是他需要精确到毫秒 PEXPIREAT key_name 1626521962 (2021-07-17 19:39:22 过期)
6 PERSIST 移除 key 的过期时间,让其成为持久 key PERSIST key_name
7 PTTL 以毫秒为单位返回 key 剩余的过期时间 PTTL key_name
8 TTL 以秒为单位返回 key 剩余的过期时间 TTL key_name
9 SETEX 同时设置过期时间为秒和键值 SETEX key_name 10 "hello"

所谓的 易失 KEY 主要就是被 Redis 命令所设置了过期时间的(如EXPIRE\EXPIRET\PEXPIRE\PEXPIREAT)所进行设置的。

这些易失的KEY只能通过使用 DEL、SET、GETSET、PERSIST 等 STORE(存储) 命令进行清楚或覆盖成为 持久 key(persistent)

只能通过覆盖或清除的方式来让其成为持久key,像诸如更改 key 名称、修改 key 值、自增的做法并不适用,过期时间依然会移植到新的 key 上。

对于通过 EXPIREAT 命令来使用 Unix 时间戳让 key 成为易失 KEY 的方式,可以通过:https://tool.chinaz.com/tools/unixtime.aspx 转换工具来完成。

于此同时需要注意的是 EXPIRESETEX 相比之下 SETEX 区别就是原子性的操作

原子性就是要么同时发生,要么就什么都不发生

关于过期时间的准确性

由于我们所使用的是 redis 2.6 因此过期时间的精度往往比 redis 2.4 提高到 0~1 毫秒之多。需要注意的是如果使用绝对 Unix 时间戳的方式进行存储,那么无论 Redis 是否运行都会流逝,但如果服务器时间并不精准,那也会导致易失 key 可靠性会降低。

过期时间的淘汰流程

Redis key 的过期时间被分为两种淘汰过程,分别为被动方式和主动,而被动方式最好理解的就是当你访问了该 key ,而这时候恰好该 key 是过期的,那么这个 key 就会被发现之后淘汰了。

当然这种方式存在缺点,假设你这个 key 永远不会被访问,那么他岂不是会存在直到你访问的那天,于是 主动过期就出来了。

主动过期的淘汰方式也就是周期性的主动随机检查一部分被设置生存时间的 key,当扫到过期时间到了的 key 将会在 key 空间中删除,Redis 每 10 秒都会执行这个操作。

本文使用《江雪分析公开知识存储库知识共享许可证》进行发布